home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 098 / bal.c < prev    next >
Text File  |  1985-06-03  |  4KB  |  125 lines

  1. #include <stdio.h>
  2. /****************************************************************/
  3. /* Balance comments, quotes, ifdefs, parens, and braces in    */
  4. /* C programs. Ed Post, Wilsonville OR, 8-18-84            */
  5. /****************************************************************/
  6.  
  7. main(argc,argv)
  8. INT16 argc;
  9. char **argv;
  10. {
  11. FILE *f,*fopen();
  12. int lines,comments,parens,braces,ifdefs,singleQuote,doubleQuote,c;
  13. int commentLines[25],parenLines[100],braceLines[100],ifdefLines[10];
  14. char buf[100], *p;
  15.  
  16. if (!--argc) {
  17.    printf("usage: bal <file> ... ");
  18.    exit(1);
  19. }
  20.  
  21. while (argc--) {
  22.    argv++;
  23.  
  24.    if ((f=fopen(*argv,"r"))==NULL) {
  25.       printf("can't open file.\n");
  26.       exit(1);
  27.    }
  28.  
  29.    lines=parens=braces=comments=ifdefs=singleQuote=doubleQuote=0;
  30.  
  31.    while (fgets(buf,100,f)!=NULL) {
  32.       lines++;
  33.       if (strncmp(buf,"#ifdef",6)==0 || strncmp(buf,"#ifndef",7)==0) {
  34.          if (ifdefs) printf("nested #ifdefs: lines %d and %d\n",
  35.             ifdefLines[ifdefs-1],lines);
  36.          ifdefLines[ifdefs++]=lines;
  37.       continue;
  38.       }
  39.       if (strncmp(buf,"#endif",6)==0) {
  40.          if (!ifdefs)
  41.             printf("#endif without #ifdef: line %d\n",
  42.                lines);
  43.          else ifdefs--;
  44.       continue;
  45.       }
  46.          
  47.       p=buf;
  48.       while (c=*p++) {
  49.          if (singleQuote) {
  50.             if (c=='\'' && (*(p-2)!='\\' || *(p-3)=='\\')) singleQuote--;
  51.             continue;
  52.          }
  53.  
  54.          if (doubleQuote) {
  55.             if (c=='"' && (*(p-2)!='\\' || *(p-3)=='\\')) doubleQuote--;
  56.             continue;
  57.          }
  58.  
  59.          if (c=='/' && *p=='*') {
  60.             if (comments) printf("nested comments: lines %d and %d\n",
  61.                commentLines[comments-1],lines);
  62.             commentLines[comments++]=lines;
  63.          }
  64.          if (c=='*' && *p=='/') {
  65.             if (!comments) printf("extra close comment: line %d\n",lines);
  66.             comments--;
  67.          }
  68.          if (comments || singleQuote || doubleQuote) continue;
  69.  
  70.          if (c=='\'') singleQuote++;
  71.  
  72.          if (c=='"') doubleQuote++;
  73.  
  74.          if (c=='{') {
  75.             if (parens) printf("open brace inside parens: lines %d and %d\n",
  76.                parenLines[parens-1],lines);
  77.             braceLines[braces++]=lines;
  78.          }
  79.          if (c=='}') {
  80.             if (parens) printf("close brace inside parens: lines %d and %d\n",
  81.                parenLines[parens-1],lines);
  82.             if (!braces) printf("unmatched close brace: line %d\n",lines);
  83.             else braces--;
  84.          }
  85.          if (c=='(') {
  86.             parenLines[parens++]=lines;
  87.          }
  88.          if (c==')') {
  89.             if (!parens) printf("unmatched close paren: line %d\n",lines);
  90.             else parens--;
  91.          }
  92.       }
  93.    if (singleQuote) printf("unclosed single quote: line %d\n",lines);
  94.    if (doubleQuote) printf("unclosed double quote: line %d\n",lines);
  95.    singleQuote=doubleQuote=0;
  96.    }
  97.    printf("file: %s;  lines: %d\n",*argv,lines);
  98.    while (ifdefs) printf("unclosed ifdef: line %d\n",ifdefLines[--ifdefs]);
  99.    while (comments)
  100.       printf("unclosed comment: line %d\n",commentLines[--comments]);
  101.    while (braces) printf("unclosed brace: line %d\n",braceLines[--braces]);
  102.    while (parens) printf("unclosed paren: line %d\n",parenLines[--parens]);
  103.  
  104.    fclose(f);
  105.  }
  106. }
  107.  
  108. int strncmp(x,y,n)
  109. char *x, *y;
  110. int n;
  111. {
  112. int c;
  113.     while (n--) {
  114.         if (c=*x-*y++) return (c);
  115.         if (*x++=='\0') return (0);
  116.     }
  117.     return (0);
  118. }
  119.  
  120.  
  121. 
  122.              
  123.  
  124.  
  125.